#!/usr/bin/env python
# coding=utf-8
# @FileName :read_file.py
# @Time     :2022/2/10 17:45
# @Author   :ZXC
# @Desc     : 读取测试配置和用例
from typing import Any

from loguru import logger

from config.settings import CONFIG_DIR, DATA_DIR
from tools.excel_util import ExcelReadUtil
from tools.yaml_util import YamlUtil


class ReadFile(object):
    """
    测试读取类
    """

    @staticmethod
    def get_config_dict(file_path=None) -> dict:
        """
        读取yaml配置文件，并且转换成字典
        :param file_path:
        :return: config_dict
        """
        # 默认读取的yaml文件
        if not file_path:
            file_path = CONFIG_DIR.joinpath('config.yaml')
        logger.debug(f'读取配置文件【{file_path}】')
        config_dict = YamlUtil.read_yaml(file_path)
        logger.debug(f'读取配置文件【{file_path}】完成，配置数据为===>{config_dict}')
        return config_dict

    @staticmethod
    def read_config(expr: str = ".") -> Any:
        """
        默认读取config目录下的config.yaml配置文件，根据传递的expr jsonpath表达式可任意返回任何配置项
        :param expr: 提取表达式, 使用jsonpath语法,默认值提取整个读取的对象
        :return: 根据表达式返回的值
        """
        logger.debug(f'读取配置文件,使用jsonpath表达式【{expr}】提取')
        from tools.common import extractor
        value = extractor(ReadFile.get_config_dict(), expr)
        logger.debug(f'提取完成，提取结果===>{value}')
        return value

    @staticmethod
    def read_testcase_by_excel():
        """
        读取excel格式的测试用例,返回一个生成器对象
        :return 生成器
        """
        excel_filepath = DATA_DIR.joinpath('test_case.xlsx')
        logger.debug(f'读取测试用例文件【{excel_filepath}】')
        excel_data_generator = ExcelReadUtil(excel_filepath).get_dict_fmt_datas_generator()
        # 用来判断是第几条用例
        current_case = 0
        for row_data in excel_data_generator:
            if row_data.get('是否执行') != '否':
                row_data.pop('是否执行')
                current_case += 1
                logger.debug(f'获取到第{current_case}条测试数据===>{row_data}')
                yield row_data

    @staticmethod
    def read_testcase_by_yaml(yaml_filepath_list) -> list:
        """
        :param 用例文件目录
        读取yaml格式的测试用例,返回一个生成器对象
        :return 生成器
        """
        # excel_data_generator = list()
        for file in yaml_filepath_list:
            logger.debug(f'读取测试用例文件【{file}】')
            try:
                excel_data_generator = YamlUtil.read_yaml(file).get('cases')
                for row_data in excel_data_generator:
                    if row_data.get('is_run'):
                        row_data.pop('is_run')
                        yield row_data
                # return excel_data_generator
            except Exception as e:
                logger.warning(f'读取用例文件失败，跳过该文件测试==>{e}')


if __name__ == '__main__':
    data = ReadFile.read_testcase_by_yaml(
        [DATA_DIR.joinpath('asset').joinpath('organize').joinpath('findOrganizeTree.yaml')])
    print(data)
    for i in data:
        print(i)
